package ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import controller.SimpleHashMap;
import controller.TableModel;
@SuppressWarnings("serial")
public class MainPanel extends JPanel {
private JButton search = new JButton("Search");
private JButton addWord = new JButton("Add Word");
private JButton deleteWord = new JButton("Del Word");
private JButton open = new JButton("Open");
private JButton save = new JButton("Save");
private JButton update = new JButton("Update");
private JButton empty = new JButton("Empty");
private JLabel searchLabel = new JLabel("Search:");
private JButton exit = new JButton("Log out");
private JSeparator bar1 = new JSeparator(JSeparator.HORIZONTAL);
private JSeparator bar2 = new JSeparator(JSeparator.VERTICAL);
private JSeparator bar3 = new JSeparator(JSeparator.HORIZONTAL);
private JLabel statistics = new JLabel("Statistics:");
private JLabel searchResults = new JLabel("Search results:");
private JLabel consistent = new JLabel("Consistency:");
private JLabel nrWords = new JLabel("Nr. of words:");
private File file;
private JTextField textField = new JTextField();
private JTextField consistentField = new JTextField(" ?");
private JTextField nrWordsField = new JTextField();
private JTextArea textArea = new JTextArea();
private JButton showAll = new JButton("Show All");
SimpleHashMap hashMap;
public MainPanel(JFrame frame, SimpleHashMap hashMap) {
this.hashMap = hashMap;
this.setLayout(null);
setBound(this.searchLabel, new Rectangle(10, 10, 90, 30));
add(this.searchLabel);
TableModel tableModel = new TableModel(hashMap);
JTable table = new JTable(tableModel);
table.getColumnModel().getColumn(1).setPreferredWidth(250);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
setBound(this.textField, new Rectangle(60, 16, 120, 20));
add(this.textField);
setBound(this.search, new Rectangle(184, 16, 83, 20));
add(this.search);
search(frame, table);
setBound(this.bar1, new Rectangle(0, 50, 275, 10));
add(bar1);
setBound(this.bar3, new Rectangle(0, 300, 400, 10));
add(bar3);
setBound(this.bar2, new Rectangle(275, 0, 10, 400));
add(bar2);
setBound(this.addWord, new Rectangle(290, 16, 90, 30));
add(this.addWord);
addWord(frame, table);
addWord.setEnabled(false);
setBound(this.deleteWord, new Rectangle(290, 56, 90, 30));
add(this.deleteWord);
deleteWord(frame, table);
deleteWord.setEnabled(false);
setBound(this.open, new Rectangle(290, 96, 90, 30));
add(this.open);
open(frame, table);
setBound(this.save, new Rectangle(290, 136, 90, 30));
add(this.save);
save(frame, table);
save.setEnabled(false);
setBound(this.update, new Rectangle(290, 176, 90, 30));
add(this.update);
updateWord(frame, table);
update.setEnabled(false);
setBound(this.empty, new Rectangle(290, 216, 90, 30));
add(this.empty);
empty(frame, table);
empty.setEnabled(false);
setBound(this.exit, new Rectangle(290, 256, 90, 30));
add(this.exit);
addExit(frame);
setBound(this.statistics, new Rectangle(305, 295, 90, 30));
add(this.statistics);
setBound(this.consistent, new Rectangle(280, 312, 90, 30));
add(this.consistent);
consistentField.setEditable(false);
setBound(this.consistentField, new Rectangle(355, 318, 30, 20));
add(this.consistentField);
setBound(this.nrWords, new Rectangle(280, 335, 90, 30));
add(this.nrWords);
nrWordsField.setText(" " + Integer.toString(hashMap.getTotalEntriesForTable()));
nrWordsField.setEditable(false);
setBound(this.nrWordsField, new Rectangle(355, 340, 30, 20));
add(this.nrWordsField);
setBound(this.searchResults, new Rectangle(10, 298, 90, 30));
add(this.searchResults);
JPanel area = new JPanel();
area.setBackground(Color.GRAY);
area.setLayout(new BorderLayout());
frame.add(area);
area.setBounds(new Rectangle(8, 65, 260, 225));
add(area);
// scroll.setBounds(175, 20, 300, 300);
JScrollPane scroll = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setViewportView(table);
area.add(scroll, BorderLayout.CENTER);
setBound(this.showAll, new Rectangle(184, 303, 83, 20));
add(this.showAll);
showAll(frame, table);
JScrollPane scrollArea = new JScrollPane(textArea);
scrollArea.setBounds(new Rectangle(8, 325, 260, 38));
textArea.setEditable(false);
add(scrollArea);
}
public void setBound(Component comp, Rectangle bounds) {
comp.setBounds(bounds);
}
private void search(JFrame frame, JTable table) {
search.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String result = hashMap.searchElement(textField.getText());
textArea.setText(result);
if (textArea.getText().equals("clear")){
textArea.setText("");
}
((TableModel) table.getModel()).updateModel();
table.updateUI();
}
});
}
private void showAll(JFrame frame, JTable table) {
showAll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (textArea.getText() != null && !textArea.getText().equals("")){
JOptionPane.showMessageDialog(frame,textArea.getText());
} else {
JOptionPane.showMessageDialog(frame,"Nothing to show.");
}
}
});
}
private void addWord(JFrame frame, JTable table) {
addWord.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JLabel nameLabel = new JLabel("Name of the word: ");
JTextField name = new JTextField();
JLabel synonimLabel = new JLabel("Synonim: ");
JTextField synonim = new JTextField();
Object[] ob = { nameLabel, name, synonimLabel, synonim };
int result = JOptionPane.showConfirmDialog(null, ob, "Adding word", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
if (hashMap.getHashMap().containsKey(name.getText())) {
JOptionPane.showMessageDialog(frame,
"Word is already in dictionary. Did you mean updating it?");
} else {
hashMap.addElement(name.getText(), Arrays.asList(synonim.getText().split(",")));
if(hashMap.isAlpha(synonim.getText())){
JOptionPane.showMessageDialog(frame, "New word added");
}
}
check();
((TableModel) table.getModel()).updateModel();
table.updateUI();
}
}
});
}
private void updateWord(JFrame frame, JTable table) {
update.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (table.getSelectedRow() >= 0) {
JLabel synonimLabel = new JLabel("Synonims: ");
JTextField synonim = new JTextField();
Object[] ob = { synonimLabel, synonim };
int result = JOptionPane.showConfirmDialog(null, ob, "Updating word", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
hashMap.updateElement((String) table.getValueAt(table.getSelectedRow(), 0),
Arrays.asList(synonim.getText().split(",")));
if(hashMap.isAlpha(synonim.getText())){
JOptionPane.showMessageDialog(frame, "New synonim added");
}
}
check();
((TableModel) table.getModel()).updateModel();
table.updateUI();
} else {
JOptionPane.showMessageDialog(frame, "Please select a word!");
}
}
});
}
private void deleteWord(JFrame frame, JTable table) {
deleteWord.addActionListener(new ActionListener() {
@SuppressWarnings("rawtypes")
@Override
public void actionPerformed(ActionEvent e) {
if (table.getSelectedRow() >= 0) {
String deletedElement = (String) table.getValueAt(table.getSelectedRow(), 0);
hashMap.removeElement(deletedElement);
Iterator it = hashMap.getHashMap().entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
if (((List)entry.getValue()).contains(deletedElement)){
((List)entry.getValue()).remove(deletedElement);
}
}
((TableModel) table.getModel()).updateModel();
check();
table.updateUI();
} else {
JOptionPane.showMessageDialog(frame, "Please select a word!");
}
}
});
}
private void empty(JFrame frame, JTable table) {
empty.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hashMap.getHashMap().clear();
check();
((TableModel) table.getModel()).updateModel();
table.updateUI();
}
});
}
private void check() {
nrWordsField.setText(" " + Integer.toString(hashMap.getTotalEntriesForTable()));
if (hashMap.isConsistent()) {
consistentField.setText(" Yes");
} else {
consistentField.setText(" No");
}
}
private void open(JFrame frame, JTable table) {
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(getComponent(0)) == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
try {
hashMap.populate(file.getName());
addWord.setEnabled(true);
deleteWord.setEnabled(true);
update.setEnabled(true);
empty.setEnabled(true);
save.setEnabled(true);
} catch (IOException er) {
er.printStackTrace();
}
check();
((TableModel) table.getModel()).updateModel();
table.updateUI();
}
}
});
}
private void save(JFrame frame, JTable table) {
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
hashMap.saveToFile(file);
check();
((TableModel) table.getModel()).updateModel();
table.updateUI();
}
});
}
private void addExit(JFrame frame) {
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.dispose();
}
});
}
}